//RootPath를 구한다.
function getRootPos() {
	var path = getCurrentPath(), depth = path.split("/").length - 1, result = "", ii = 0;

	for (; ii < depth; ii++)
		result += "../";

	return result;
}

// 현재 경로 Path를 구한다.
function getCurrentPath() {
	var cPath = location.href, path = cPath.substring(cPath.lastIndexOf("www") + 4, cPath.length);

	return path;
}

// json 을 nvp로 변환
var jsonToNvp = function(json) {
	var nvp = [];

	$.each(json, function(key, val) {
		nvp.push(key + "=" + val);
	});

	return nvp.join("&");
}

// Device 여부 확인
var isDevice = function() {
	return !(undefined === window.MDHAndroid && !is_iphone)
}

var Storage = (function() {
	var my = {};
	// 로컬 스토리지에 정보 저장
	my.setLocalData = function(key, value) {
		if (typeof value) {
			value = JSON.stringify(value)
		}
		localStorage.setItem(key, value);
	}
	// 로컬 스토리지에서 정보 읽기
	my.getLocalData = function(key, valid) {
		var result = localStorage.getItem(key), ret_obj;
		if (valid == true) {
			localStorage.removeItem(key);
		}
		if (!result) {
			return false;
		}
		try {
			ret_obj = JSON.parse(result);
			return ret_obj;
		} catch (e) {
			return result;
		}
	}
	// 로컬 스토리지 삭제
	my.removeLocalData = function(key) {
		localStorage.removeItem(key);
	}

	// 세션 스토리지에 정보 저장
	my.setSessionData = function(key, value) {
		if (typeof "2" === "object") {
			value = JSON.stringify(value)
		}
		sessionStorage.setItem(key, value);
	};

	// 세션 스토리지에서 정보 읽기
	my.getSessionData = function(key, valid) {
		var result = sessionStorage.getItem(key), ret_obj = "";

		if (valid == true)
			sessionStorage.removeItem(key);
		try {
			ret_obj = JSON.parse(result);
			return ret_obj;
		} catch (e) {
			return result;
		}
	};

	// 세션 스토리지 삭제
	my.removeSessionData = function(key) {
		sessionStorage.removeItem(key);
	};

	// 웹DB 열기 (없으면 생성)
	my.getDataBase = function(param) {
		var name = param.name || "", ver = param.ver || "", caption = param.caption || "", db_obj;

		db_obj = openDatabase(name, ver, caption, 2);
		database = db_obj;
		return db_obj;
	};

	// 웹DB 실행
	my.execDataBase = function(sql_string, callback) {
		database.transaction(function(tx) {
			tx.executeSql(sql_string, [], function(tx, rs) {
				var rows = rs.rows, i, max, row_array = [];

				for (i = 0, max = rows.length; i < max; i++) {
					row_array.push(rows.item(i));
				}

				if (callback) {
					callback(row_array);
				}
			}, function(a, b, c, d) {
				if (callback) {
					callback([]);
				}
			});
		});
	};

	// 반복 아이템 웹DB 실행
	my.execRepeatDataBase = function(sql_string, item, callback) {
		if (!callback) {
			log.e(TAG, "DB 쿼리 뒤에 반드시 CallBack이 있어야 합니다.");
			return;
		}
		;
		var row_array = [], sql;
		database.transaction(function(tx) {

			for ( var i = 0, max_item = item.length; i < max_item; i++) {
				sql = sql_string + "'" + item[i] + "'";

				(function() {
					var k = i;
					tx.executeSql(sql, [], function(tx, rs) {
						var rows = rs.rows, j, max;

						for (j = 0, max = rows.length; j < max; j++) {
							row_array.push(rows.item(j));
						}
						if (k === max_item - 1) {
							callback(row_array);
						}
					});

				})(i, sql);
			}
		});
	};

	// 반복 다중 쿼리 실행
	my.execRepeatSqlDataBase = function(Data, callback, failure) {
		if (Data.length === 0) {
			callback();
			return;
		}
		database.transaction(function(tx) {
			for ( var i = 0, max_item = Data.length; i < max_item; i++) {
				(function() {
					var k = i;
					var sql = Data[i];
					tx.executeSql(sql, [], function(tx, rs) {
						if (k === max_item - 1) {
							callback(max_item);
						}
					}, function(a, b) {
						if (failure) {
							failure(a, b, sql);
						}
					});
				})(i, Data[i]);
			}
		});
	};

	// 웹DB 테이블 생성
	my.createTable = function(tablename, data, callback) {
		database.transaction(function(tx) {

			var sql, sql_arr = [], i;

			sql = "CREATE TABLE IF NOT EXISTS " + tablename + " (";

			if ($.isArray(data)) {
				sql += data.join(",");
			} else {
				for (i in data) {
					sql_arr.push(i + " VARCHAR(255)");
				}
				sql += sql_arr.join(",");
			}
			sql += ")";

			tx.executeSql(sql, [], function() {
				if (callback)
					callback();
			});
		});
	};

	// 웹DB 테이블 제거
	my.dropTable = function(tablename, callback) {
		database.transaction(function(tx) {

			var sql;
			sql = "DROP TABLE IF EXISTS " + tablename;
			tx.executeSql(sql, [], function() {
				if (callback)
					callback();
			});
		});
	};

	// 웹DB delete
	my.deleteDataBase = function(tablename, callback) {
		database.transaction(function(tx) {

			var sql;
			sql = "delete from " + tablename;
			tx.executeSql(sql, [], function() {
				if (callback)
					callback();
			});
		});
	};

	// 웹DB insert
	my.insertDataBase = function(tablename, data, callback) {
		database.transaction(function(tx) {
			var arr_field = [], arr_value = [], arr_data_set = [], sb2, sb = "insert into ", i, j;
			sb += tablename;
			sb += "( ";

			if (!Array.isArray(data)) {
				data = [ data ];
			}

			for (i in data[0]) {
				arr_field.push(i);
				arr_value.push("?");
			}
			sb += arr_field.join(",");
			sb += ") ";
			sb += " values(";
			sb += arr_value.join(",");
			sb += ") ";

			for (j = 0; j < data.length; j++) {
				if ($.isEmptyObject(data)) {
					continue;
				}
				arr_data_set = [];
				for (i in data[j]) {
					arr_data_set.push(data[j][i]);
				}
				// console.log(arr_data_set);
				(function() {
					var k = j;

					tx.executeSql(sb, arr_data_set, function() {
						if (k === data.length - 1) {
							if (callback)
								callback(true);
						}
					});
				})(j);
			}
		});
	};

	// 웹DB update
	my.updateDataBase = function(tablename, data, where, callback) {
		database.transaction(function(tx) {
			var update_sql = [], sb2, sb = "update ", i, j;
			sb += tablename;
			sb += " SET ";

			if (!Array.isArray(data)) {
				data = [ data ];
			}

			for (j = 0; j < data.length; j++) {
				update_sql = [];
				for (i in data[0]) {
					update_sql.push(i + " = '" + data[j][i] + "'");
				}
				sb += update_sql.join(", ") + where;

				(function() {
					var k = j;

					tx.executeSql(sb, [], function() {
						if (k === data.length - 1) {
							if (callback) {
								callback(true);
							}
						}
					}, function(a, b) {
						// alert(JSON.stringify(b));
					});
				})(j);
			}
		});
	};

	// 웹DB 실행
	my.setDataBase = function(sql, callback) {
		database.transaction(function(tx) {
			tx.executeSql(sql, [], function(tx, rs) {
				if (callback) {
					callback();
				}
			}, function(a, b) {
				log.e("WebSqlError", b);
			});
		});
	};

	// 웹DB 실행후 data 넣기
	my.pushDataBase = function(param, map, sql, callback) {
		database.transaction(function(tx) {
			var i, j, max, sql_string, result = [];
			sql += " where ";
			for (i = 0, max = param.length; i < max; i++) {
				for (j in map) {
					sql_string = sql + map[j][0] + "='" + param[i][j] + "'";
					(function() {
						var k = i;
						var q = j;
						tx.executeSql(sql_string, [], function(tx, rs) {
							try {
								param[k][map[q][1]] = rs.rows.item(0)[map[q][1]];
							} catch (e) {
								param[k][map[q][1]] = "";
							}

							if (k === (max - 1)) {
								callback(param);
							}
						});
					})(i, j);
				}
			}
		});
	};

	// 웹DB 실행
	my.isTable = function(tablename, callback) {
		var sql = "SELECT count(*)as cnt FROM sqlite_master " + "WHERE type = 'table' AND name = '" + tablename + "' ";

		database.transaction(function(tx) {
			tx.executeSql(sql, [], function(tx, rs) {
				var rows = rs.rows;
				for ( var i = 0; i < rows.length; i++) {
					var row = rows.item(i);
					callback(row.cnt);
				}
			});
		});
	};

	return my;
})();

var UTIL = (function() {
	var my = {};

	my.find = function(data, key, value) {
		console.log("data : ", data);
		console.log("key : ", key);
		console.log("value : ", value);
		var i, data_array = [];
		if (Array.isArray(data)) {
			for (i = data.length; i--;) {
				if (data[i][key] === value || (data[i][key].indexOf(value) > -1)) {
					data_array.push(data[i]);
				}
			}
			if (data_array.length === 0) {
				return "데이터가 존재하지 않습니다";
			} else {
				return data_array;
			}
		}
	};

	my.deleteObject = function(data, key, value) {
		var i, data_array = [];
		if (Array.isArray(data)) {
			for (i = data.length; i--;) {
				if (!(data[i][key] === value)) {
					data_array.push(data[i]);
				}
			}
			if (data_array.length === 0) {
				return [];
			} else {
				return data_array;
			}
		}
	};

	/**
	 * 배열을 받아서 인덱스 부분의 값만 잘라서 리턴해주는 메소드.
	 * 
	 * @type function
	 * @name arrayRemoveItem
	 * @function
	 * @memberOf UTIL
	 * @param {Array}
	 *            data 특정 부분을 제거 하고 싶은 배열 값.
	 * @param {NUMBER}
	 *            idx 잘라 내고 싶은 특정 배열의 인덱스 값.
	 * 
	 */
	// 배열 특정 인덱스 삭제
	my.arrayRemoveItem = function(data, idx) {
		var data_length = data.length;
		var result = [];

		if (data_length <= idx) {
			result = data.slice(0, idx - 1);
		} else {
			result = data.slice(0, idx);
			result = result.concat(data.slice(idx + 1));
		}
		return result;
	};

	my.firstDate = function(date) {
		var Year = date.substring(0, 4);
		var Month = date.substring(4, 6);
		var date = new Date(Year, Month - 1 , 1);
		return my.getDate(date);
	}
	
	/**
	 * 
	 * yyyyMM 형식의 날짜를 받으면 그달의 마지막 날짜가 몇일 인지 구해서 리턴함.
	 * 
	 * @type function
	 * @name lastDate
	 * @function
	 * @memberOf UTIL
	 * @param {STRING |
	 *            NUMBER} date yyyyMM 형식의 날짜 테이터.
	 * @returns {STRING} 해당하는 날짜(dd)를 리턴
	 * 
	 */
	// 달의 마지막 날짜 구하기
	// lastDate = new Date(new Date(today.getFullYear(), today.getMonth()+1, 1)-86400000).getDate();
	my.lastDate = function(date) {
		var Year = date.substring(0, 4);
		var Month = date.substring(4, 6);
		var date = new Date(Year, Month, 1) - 86400000;
		return my.getDate(date);
	}
	
	/**
	 * 
	 * yyyyMMdd 형식의 날짜를 받으면 알맞은 포멧으로 변경 해서 리턴함
	 * 
	 * @type function
	 * @name dateFormat
	 * @function
	 * @memberOf UTIL
	 * @param {STRING |
	 *            NUMBER} date yyyyMM 형식의 날짜 테이터.
	 * @returns {STRING} 해당하는 날짜(dd)를 리턴
	 * 
	 */
	// Date() 형식에 맞도록 날짜 변경
	my.dateFormat = function(date, div) {
		div = div || "-";
		if (!date) {
			return "";
		} else if (date.length === 6) {
			return date.substring(0, 4) + div + date.substring(4, 6);
		} else {
			return date.substring(0, 4) + div + date.substring(4, 6) + div + date.substring(6, 8);
		}
	}

	//오늘 날짜 리턴
	my.today = function(num) {
		var date = new Date();
		if (num === 6) {
			return date.getFullYear() + my.zeroFiller(2, date.getMonth() + 1);
		} else {
			return date.getFullYear() + my.zeroFiller(2, date.getMonth() + 1) + my.zeroFiller(2, date.getDate());
		}
	}

	/**
	 * 
	 * yyyyMMdd형식의 날짜 값을 받고, 숫자를 받아서 숫자만큼 일을 빼서 계산해주는 메소드.
	 * 
	 * @type function
	 * @name subDay
	 * @function
	 * @memberOf UTIL
	 * @param {STRING |
	 *            NUMBER} date yyyyMMdd 형식의 날짜 테이터.
	 * @param {NUMBER}
	 *            num 빼고싶은 만큼의 일단위 숫자.
	 * @returns {STRING} date 값에서 num만큼 뺀 yyyyMMdd의 값을 리턴.
	 * 
	 */
	// 지정한 수만큼 +한 일 계산 (YYYYMMDD형식의 날짜가 들어와야함.)
	my.subDay = function(date, num, type) {
		var calc_date;
		if(String(date).length === 13){
			calc_date = new Date(date).getTime() - (num * 86400000);
		}
		else {
			calc_date = new Date(my.dateFormat(date)).getTime() - (num * 86400000);
		}

		if (type === "dateType") {
			calc_date = new Date(calc_date);
			return "" + calc_date.getFullYear() + my.zeroFiller(2, calc_date.getMonth() + 1) + my.zeroFiller(2, calc_date.getDate());
		} else {
			return calc_date;
		}
	}

	/**
	 * 
	 * yyyyMMdd형식의 날짜 값을 받고, 숫자를 받아서 숫자만큼 일을 더해서 계산해주는 메소드.
	 * 
	 * @type function
	 * @name addDay
	 * @function
	 * @memberOf UTIL
	 * @param {STRING |
	 *            NUMBER} date yyyyMMdd 형식의 날짜 테이터.
	 * @param {NUMBER}
	 *            num 더하고싶은 만큼의 일단위 숫자.
	 * @returns {STRING} date 값에서 num만큼 더한 yyyyMMdd의 값을 리턴.
	 * 
	 */
	// 지정한 수만큼 +한 일 계산 (YYYYMMDD형식의 날짜가 들어와야함.)
	my.addDay = function(date, num, type) {
		var calc_date;
		if(String(date).length === 13){
			calc_date = new Date(date).getTime() + (num * 86400000);
		}
		else {
			calc_date = new Date(my.dateFormat(date)).getTime() + (num * 86400000);
		}

		if (type === "dateType") {
			calc_date = new Date(calc_date);
			return "" + calc_date.getFullYear() + my.zeroFiller(2, calc_date.getMonth() + 1) + my.zeroFiller(2, calc_date.getDate());
		} else {
			return calc_date;
		}
	};

	//date 형식 yyyyMMdd리턴
	my.getDate = function(time) {
		date = new Date(time);
		return date.getFullYear() + my.zeroFiller(2, date.getMonth() + 1) + my.zeroFiller(2, date.getDate());
	};
	
	//date 형식 yyyyMMdd리턴
	my.getDateHanFormat = function(time) {
		date = new Date(time);
		return date.getFullYear() + "년 " + my.zeroFiller(2, date.getMonth() + 1) + "월 " + my.zeroFiller(2, date.getDate()) + "일";
	};

	//원하는 길이만큼 앞에 0 채우기
	my.zeroFiller = function(len, str) {
		var i = len - str.toString().length, zero_temp = "";

		for (; i--;) {
			zero_temp += "0";
		}
		return zero_temp + str;
	};

	//문자 숫자로 변환
	my.NUMBER = function(string) {
		var num;
		if (typeof string === "string") {
			num = Number(my.deleteSC(string));
			if (num !== "NaN") {
				return num;
			} else {
				return parseInt(my.deleteSC(string), 10);
			}
		} else if (typeof string === "number") {
			return string;
		}
	}

	//특수 문자 제거
	my.deleteSC = function(string) {
		if (string) {
			return string.replace(/[-:]/gi, "");
		} else {
			return string;
		}
	}
	return my;
})();
